package esercitazione5.graphs;

/**
 * Interfaccia generica per la gestione di un grafo
 *
 * @param <V>
 * @param <E>
 */
public interface GraphInterface<V,E> {
	/**
	 * Ritorna una lista iterabile di tutti i vertici
	 */
	public Iterable<Vertex<V>> vertices();
	
	/**
	 * Ritorna una lista iterabile di tutti gli edge
	 */
	public Iterable <Edge<V>> edges();
	
	/**
	 * Inserisce un nuovo Vertice all'interno del grafo
	 * @param e Valore da inserire
	 * @return Il vertice inserito
	 */
	public Vertex<V> insertVertex(V e);
	
	/**
	 * Inserimento di un  nuovo Edge all'interno del grafo
	 * @param s Vertice sorgente
	 * @param d Vertice destinazione
	 * @param e Valore dell'Edge
	 * @return L'Edge appena inserito 
	 */
	public Edge<V> insertEdge(Vertex<V> s, Vertex<V> d, E e);
	
	/**
	 * Lista iterabile di tutti gli Edge uscenti da un Vertice
	 * @param v Verice da analizzare
	 */
	public Iterable <Edge<V>> outgoingEdges(Vertex<V> v);
	
	/**
	 * Ritorna il numero di Edge
	 */
	public int numEdges();
	
	/**
	 * Ritorna il numero di vertici
	 */
	public int numVertices();
}